import 'reflect-metadata'

// Controller 参数的情况：
// 1. 可以为空
// 2. 可以写成空串
// 3. 可以写成非空字符串
// 4. 可以写成一个对象

interface ControllerOptions {
  prefix?: string
}

// 已函数重载的写法兼容上面的参数情况
export function Controller(): ClassDecorator;  // 空串
export function Controller(prefix: string): ClassDecorator; // 路径前缀
export function Controller(options: ControllerOptions): ClassDecorator; // 传递对象
export function Controller(prefixOrOptions?: string | ControllerOptions): ClassDecorator {
  let options: ControllerOptions = {}
  if(typeof prefixOrOptions === 'string') {
    options.prefix = prefixOrOptions
  } else if (typeof prefixOrOptions === 'object') {
    options = prefixOrOptions
  }
  // 这是一个类装饰器，装饰的控制器这个类
  return (target: Function) => {
    // 给控制器类添加 prefix 路径的元数据
    Reflect.defineMetadata('prefix', options.prefix || '', target)
  }
}
